/*
 * wbh实习专用，其他人无权访问
 *Practice IntelligenceMajor YCHS 2022
 *努力不一定有回报
 */
package com.wbh.dao;

import com.wbh.domain.User;
import com.wbh.util.DbUtilHikari;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;

import cn.hutool.crypto.SecureUtil;

/**
 * @author wangbohong
 * @version 1.0
 * 对用户表的操作：注册用户、删除.. 查询.. 修改..
 */
public class UserDao {
    /**
     * 用户注册
     * @param uname 用户名
     * @param upsw 密码
     * @return 成功返回1，否则0
     */
    public int inserUser(String uname,String upsw){
        // 1. 声明一些变量备用
        // conn代表数据库连接
        Connection conn = null;
        // 预编译对象，用pstmt执行SQL语句
        PreparedStatement pstmt = null;
        // 注册成功与否的标志，如果是0注册失败；如果1注册成功
        int flag = 0;
        // 2. 获取连接
        conn = DbUtilHikari.getConnection();
        // 3. 定义并准备SQL语句
        String sql = "INSERT INTO users(username,userpsw) VALUES(?,?)";
        try {
            pstmt = conn.prepareStatement(sql);
            //4. 给?赋值
            pstmt.setString(1,uname);
            pstmt.setString(2,SecureUtil.md5(upsw));
            // 5. 执行SQL语句（下达执行指令）
            flag = pstmt.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            //关闭数据库资源
            //只用了两个，就关闭两个的
            DbUtilHikari.close(pstmt,conn);
        }

        return flag;
    }

    /**
     * 用户登录功能
     *
     * @param username 用户名
     * @param userPwd  用户密码
     * @return 登录成功返回true，失败返回false
     */
    public boolean login(String username, String userPwd) {
        boolean result = false;
        // 数据库连接对象
        Connection conn;
        // 数据库预编译对象
        PreparedStatement pst = null;
        // 结果集对象
        ResultSet rs = null;

        // 获取数据库连接
        conn = DbUtilHikari.getConnection();
        String sql = "SELECT * FROM users WHERE username=? AND userpwd=?";
        try {
            pst = conn.prepareStatement(sql);
            pst.setString(1, username);
            pst.setString(2, SecureUtil.md5(userPwd));
            rs = pst.executeQuery();
            if (rs.next()) {
                result = true;
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DbUtilHikari.close(rs, pst, conn);
        }
        return result;
    }

    /**
     * 根据用户编号删除用户
     *
     * @param userid 用户id
     * @return 删除成功返回true，删除失败返回false
     */
    public int deleteUser(int userid) {
        int result = 0;
        // 数据库连接对象
        Connection conn;
        // 数据库预编译对象
        PreparedStatement pst = null;

        // 获取数据库连接
        conn = DbUtilHikari.getConnection();
        String sql = "DELETE FROM users WHERE userid=?";
        try {
            pst = conn.prepareStatement(sql);
            pst.setInt(1, userid);
            result = pst.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DbUtilHikari.close(pst, conn);
        }
        return result;
    }


    /**
     * 修改用户信息
     *
     * @param userid   用户编号
     * @param username 用户名
     * @param userPwd  用户密码
     * @return 修改成功返回1，失败返回0
     */
    public int modifyUser(int userid, String username, String userPwd) {
        int result = 0;
        // 数据库连接对象
        Connection conn;
        // 数据库预编译对象
        PreparedStatement pst = null;

        // 获取数据库连接
        conn = DbUtilHikari.getConnection();
        String sql = "UPDATE users SET username=?, userpwd=? WHERE userid=?";
        try {
            pst = conn.prepareStatement(sql);
            pst.setString(1, username);
            pst.setString(2, SecureUtil.md5(userPwd));
            pst.setInt(3, userid);
            result = pst.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DbUtilHikari.close(pst, conn);
        }
        return result;
    }

    /**
     * 查询所有用户信息
     * @return 包含所有用户信息的列表
     */
    public List<User> selectAllUsers() {
        List<User> userList = new ArrayList<User>();
        // 数据库连接对象
        Connection conn;
        // 数据库预编译对象
        PreparedStatement pst = null;
        // 结果集对象
        ResultSet rs = null;

        // 获取数据库连接
        conn = DbUtilHikari.getConnection();
        String sql = "SELECT * FROM users";
        try {
            pst = conn.prepareStatement(sql);
            rs = pst.executeQuery();
            while (rs.next()) {
                User user = new User();
                user.setUserid(rs.getInt("userid"));
                user.setUsername(rs.getString("username"));
                user.setUserpsw(rs.getString("userpwd"));
                userList.add(user);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DbUtilHikari.close(rs, pst, conn);
        }
        return userList;
    }
}
